package com.wsx.rpc.metrics.spring;

import com.codahale.metrics.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * @author wangshuaixin
 * @Title: com.wsx.rpc.metrics.spring.MetricsConfigure
 * @Description: TODO
 * @date 2018/11/29
 */
@Configuration
public class MetricsConfigure {


    /**
     * 生命全局的度量注册器，该服务是中心容器
     * @return
     */
    @Bean
    public MetricRegistry metricRegistry() {
        return new MetricRegistry();
    }


    /**
     * TPS计算器,统计系统中某一个事件的速率
     * @param metricRegistry
     * @return
     */
    @Bean
    public Meter meter(MetricRegistry metricRegistry) {
        return metricRegistry.meter("request");
    }

    /**
     * 直方图,实时绘制直方图的数据,比如我们需要统计某个方法的网络流量
     * 提供了最大值，最小值和平均值等数据，利用这些数据，我们就可以开始绘制自定义的直方图
     * @param metricRegistry
     * @return
     */
    @Bean
    public Histogram histogram(MetricRegistry metricRegistry) {
        return metricRegistry.histogram("response");
    }

    /**
     * 本质就是一个AtomicLong实例,统计队列中Job的总数
     * @param metricRegistry
     * @return
     */
    @Bean
    public Counter counter(MetricRegistry metricRegistry) {
        return metricRegistry.counter("request-count");
    }


    /**
     * Timer是一个Meter和Histogram的组合。这个度量单位可以比较方便地统计请求的速率和处理时间
     * 可以监控功能的延迟等
     * @param metricRegistry
     * @return
     */
    @Bean
    public Timer timer(MetricRegistry metricRegistry) {
        return metricRegistry.timer("execute-time");
    }


    /**
     * 报表的展示结果组件
     * @param metricRegistry
     * @return
     */
    @Bean
    public ConsoleReporter consoleReporter(MetricRegistry metricRegistry) {
        return ConsoleReporter.forRegistry(metricRegistry)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .build();
    }
}
